Godot: WASDか上下左右Arrowで移動
KinematicBody2D のノードで、velocity を使って移動させる
押しっぱなしで加速するので、just系にするなど適宜変更する
code:gdscript.py
func _physics_process(delta):
var input_dir = Vector2.ZERO
if Input.is_action_pressed("ui_right"):
input_dir.x += 1
if Input.is_action_pressed("ui_left"):
input_dir.x -= 1
if Input.is_action_pressed("ui_down"):
input_dir.y += 1
if Input.is_action_pressed("ui_up"):
input_dir.y -= 1
input_dir = input_dir.normalized()
move_and_slide(input_dir * speed)
Input.get_axis を使った書き方
code:gd
func _physics_process(delta):
var input_dir = Vector2.ZERO
input_dir.x = Input.get_axis("ui_left", "ui_right")
input_dir.y = Input.get_axis("ui_up", "ui_down")
Input.get_vector を使った書き方
var velocity = Input.get_vector("move_left", "move_right", "move_forward", "move_back")
Input.get_action_strength()を使った書き方
code:gd
var x_mov = Input.get_action_strength("right") - Input.get_action_strength("left")
var x_mov = Input.get_action_strength("down") - Input.get_action_strength("up")
velocity = Vector2(x_mov, y_mov).normalized()
Grid-baseで動かせたい場合のレシピ
code:grid-base-move.py
extends Area2D
var tile_size = 16
var inputs = {"right": Vector2.RIGHT,
"left": Vector2.LEFT,
"up": Vector2.UP,
"down": Vector2.DOWN}
func _unhandled_input(event):
for dir in inputs.keys():
if event.is_action_pressed(dir):
move(dir)
func move(dir):
position += inputsdir * tile_size code:gd
func move(dir):
create_tween().tween_property(self, "position", position + inputsdir * TILE_SIZE, 0.1) ただし、この場合は グリッドからずれる可能性があるため、それを避けるにはTweenが完了するまで待たせたり、snap 処理が別途必要